package net.xdclass.util;

import org.springframework.context.ApplicationContext;

import java.util.Map;

/**
 * Spring上下文工具类，提供Spring上下文的存储和访问方法
 * 该类用于在应用中存储和获取Spring的ApplicationContext，以便在不同地方方便地获取和操作Spring管理的bean
 */
public class SpringContextHolder {

    // 存储Spring的ApplicationContext的静态变量
    // 通过这个变量可以在类内部方法中获取Spring上下文
    private static ApplicationContext applicationContext;

    /**
     * 设置Spring的ApplicationContext
     * 该方法用于在应用启动时将Spring的上下文对象存储在SpringContextHolder中
     *
     * @param applicationContext Spring的ApplicationContext对象
     */
    public static void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextHolder.applicationContext = applicationContext;
    }

    /**
     * 根据bean的名称获取Spring管理的bean对象
     *
     * @param name bean的名称
     * @return 对应名称的bean对象，如果找不到则返回null
     */
    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    /**
     * 获取Spring管理的所有指定类型的bean
     *
     * @param clazz 指定的bean类型
     * @param <T>   泛型类型，表示bean的类型
     * @return 包含所有指定类型bean的Map，键为bean的名称，值为bean对象
     */
    public static <T>Map<String, T> getBeans(Class<T> clazz) {
        return applicationContext.getBeansOfType(clazz);
    }

    /**
     * 根据类型获取Spring管理的单个bean
     *
     * @param clazz 指定的bean类型
     * @param <T>   泛型类型，表示bean的类型
     * @return 对应类型的单个bean对象，如果找不到则返回null
     */
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
}

